//Модуль для быстрого доступа к процедурам для отладки


#Область ПрограммныйИнтерфейс

// Описание
// 
// Выполняет запуск соответсвующего инструмента для толстого клиента или производит запись данных в базу для дальнейшей отладки
// 
// Если контекст запуска отладки является толстым клиентом открытие формы консоли происходит сразу по окончании выполнения вызова кода
// Если отладка вызывается в контексте сервера или тонкого или веб клиента, необходимая информация сохраняется в справочник Данные для отладки. 
// В таком случае вызов отладки проиходит потом из списка справочника "Данные для отладки".
// 
// Параметры:
// 	ОбъектОтладки - Запрос, СхемаКомпоновкиДанных, HTTPЗапрос, ЛюбаяСсылка, ТаблицаФормы - Объект типа Запрос
// 	НастройкиСКДИлиСоединениеHTTP - HTTPСоединение, НастройкиКомпоновкиДанных -
// 	ВнешниеНаборыДанных - Структура Из КлючИЗначение:
// 		* Ключ - Строка -
// 		* ЗНачение - ТаблицаЗначений -
// 	Наименование - Строка - Имя сохраненного объекта отладки
// Возвращаемое значение:
// Строка -СсылкаНаДанныеОтладки
// Результат выполнения сохранения данных отладки
// 	
Функция _От(ОбъектОтладки, НастройкиСКДИлиСоединениеHTTP = Неопределено, ВнешниеНаборыДанных = Неопределено,
	Наименование = "") Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОтладитьОбъект(ОбъектОтладки,
														   НастройкиСКДИлиСоединениеHTTP,
														   ВнешниеНаборыДанных,
														   Ложь,
														   Наименование);
КонецФункции

// Выполняет запуск соответсвующего инструмента для толстого клиента или производит запись данных в файл для дальнейшей отладки
// 
// Если контекст запуска отладки является толстым клиентом открытие формы консоли происходит сразу по окончании выполнения вызова кода
// Если отладка вызывается в контексте сервера или тонкого или веб клиента, необходимая информация сохраняется в файлы в каталоге инструментов на сервере. 
// В таком случае вызов отладки проиходит потом из списка справочника "Данные для отладки".
// 
// Параметры:
// 	ОбъектОтладки - Запрос, СхемаКомпоновкиДанных, HTTPЗапрос, ЛюбаяСсылка, ТаблицаФормы - Объект типа Запрос
// 	НастройкиСКДИлиСоединениеHTTP - HTTPСоединение, НастройкиКомпоновкиДанных -
// 	ВнешниеНаборыДанных - Структура Из КлючИЗначение:
// 		* Ключ - Строка -
// 		* ЗНачение - ТаблицаЗначений -
// 	Наименование - Строка - Имя сохраненного объекта отладки
// 
// Возвращаемое значение:
// Строка -СсылкаНаДанныеОтладки
// Результат выполнения сохранения данных отладки
Функция _ОтФ(ОбъектОтладки, НастройкиСКДИлиСоединениеHTTP = Неопределено, ВнешниеНаборыДанных = Неопределено,
	Наименование = "") Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОтладитьОбъект(ОбъектОтладки,
														   НастройкиСКДИлиСоединениеHTTP,
														   ВнешниеНаборыДанных,
														   Истина,
														   Наименование);
	
КонецФункции

// Описание
// Можно в любой момент присвоить значение переменной
// Параметры:
// ПараметрА - Произвольный - Произвольное значение
// ПараметрБ - Произвольный - Произвольное значение
// Возвращаемое значение:
// Произвольный - Результат выполнения сохранения алгоритма
Функция _Пр(ПараметрА, ПараметрБ) Экспорт
	ПараметрА=ПараметрБ;
	Возврат ПараметрА;
КонецФункции

#Если Не ВебКлиент Тогда

// Описание
// Выполнить код в отладчике. Аналог функции ДУ из ИР
// ВыполниитьКодВОтладчике() функция выполнения кода
// Параметры:
// Код - Строка - Значение реквизита "Код"
// П - Произвольный - Произвольное значение
// П2 - Произвольный - Произвольное значение
// П3 - Произвольный - Произвольное значение
// П4 - Произвольный - Произвольное значение
// П5 - Произвольный - Произвольное значение
// Возвращаемое значение:
// Произвольный -  Р - Результат выполнения сохранения алгоритма
//@skip-check method-too-many-params
//@skip-check bsl-variable-name-invalid
Функция _Ду(Код, П = Неопределено, П2 = Неопределено, П3 = Неопределено, П4 = Неопределено, П5 = Неопределено) Экспорт
	//@skip-check bsl-variable-name-invalid
	Р = Неопределено;
	//@skip-check server-execution-safe-mode
	Выполнить (Код);

	Возврат Р;

КонецФункции

// Описание
// 
// Параметры:
// 	ПутьЧтения - Строка, ЧтениеXML, Поток - откуда нужно прочитать XML 
// 	УпроститьЭлементы - Булево - стоит ли при чтении убирать лишние элементы структуры
// Возвращаемое значение:
// Соответствие
// Возвращаемое значение:	
// Структура -
// Возвращаемое значение:
// Неопределено - Не удалось выполнить чтение XML
Функция _XMLОбъект(ПутьЧтения, УпроститьЭлементы=Истина) Экспорт
	Возврат УИ_ПарсерXML.мПрочитать(ПутьЧтения, УпроститьЭлементы);
КонецФункции

#КонецЕсли

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
	
// Описание
// 
// Возвращает струтктуру таблиц запроса или менеджера временных таблиц
// Если передается запрос, то он превариательно выполняется.
// Если в запросе есть менеджер временных таблиц, в структуру добавляются таблицы менеджера временных таблиц запроса
//
// Параметры:
// 	ЗапросИЛИМенеджерВременныхТаблиц- Запрос, МенеджерВременныхТаблиц -
// Возвращаемое значение:
// 	Структура из КлючИЗначение:
// 		* Ключ- Строка- ИмяВременнойТаблицы
// 		* Значение - ТаблицаЗначений- Содержание временной таблицы
Функция _ВТ(ЗапросИЛИМенеджерВременныхТаблиц) Экспорт
	Если ТипЗнч(ЗапросИЛИМенеджерВременныхТаблиц) = Тип("МенеджерВременныхТаблиц") Тогда
		Возврат УИ_ОбщегоНазначенияВызовСервера.СтруктураВременныхТаблицМенеджераВременныхТаблиц(
			ЗапросИЛИМенеджерВременныхТаблиц);
	ИначеЕсли ТипЗнч(ЗапросИЛИМенеджерВременныхТаблиц) = Тип("Запрос") Тогда
		Запрос=Новый Запрос;
		Запрос.Текст=ЗапросИЛИМенеджерВременныхТаблиц.Текст;
		Для Каждого Пар Из ЗапросИЛИМенеджерВременныхТаблиц.Параметры Цикл
			Запрос.УстановитьПараметр(Пар.Ключ, Пар.Значение);
		КонецЦикла;

		Если ЗапросИЛИМенеджерВременныхТаблиц.МенеджерВременныхТаблиц = Неопределено Тогда
			Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
		Иначе
			Запрос.МенеджерВременныхТаблиц=ЗапросИЛИМенеджерВременныхТаблиц.МенеджерВременныхТаблиц;
		КонецЕсли;

		Попытка
			Запрос.ВыполнитьПакет();
		Исключение
			Возврат "Ошибка выполнения запроса " + ОписаниеОшибки();
		КонецПопытки;

		Возврат УИ_ОбщегоНазначенияВызовСервера.СтруктураВременныхТаблицМенеджераВременныхТаблиц(
			Запрос.МенеджерВременныхТаблиц);
	КонецЕсли;
КонецФункции


// Описание
// Выполняет сравнение двух таблиц значений по заданному списку колонок
// 
// Параметры:
// 	ТаблицаБазовая		- ТаблицаЗначений - первая таблица для сравнения
// 	ТаблицаСравнения	- ТаблицаЗначений - вторая таблица для сравнения
// 	СписокКолонок		- Строка 		  - Список колонок по которым нужно выполнить сравнение. 
// 											Колонки должны присутствовать в обеих таблицах
// 											Если параметр не указан, сравнение происходит по колонкам базовой таблицы
// 	
// Возвращаемое значение:
// 	Структура - Описание:
// 		* ИдентичныеТаблицы 	- Булево 			- Признак идентичности таблиц
// 		* ТаблицаРасхождений 	- ТаблицаЗначений 	- Таблица, в которой показаны расхождения сравниваемых таблиц
Функция _ТЗСр(ТаблицаБазовая, ТаблицаСравнения, СписокКолонок = Неопределено) Экспорт
	Если СписокКолонок = Неопределено Тогда
		КолонкиДляСравнения="";
	Иначе
		КолонкиДляСравнения=СписокКолонок;
	КонецЕсли;

	Попытка
		Возврат УИ_ОбщегоНазначенияВызовСервера.ВыполнитьСравнениеДвухТаблицЗначений(ТаблицаБазовая, ТаблицаСравнения,
			КолонкиДляСравнения);
	Исключение
		Возврат ОписаниеОшибки();
	КонецПопытки;
КонецФункции


// Описание
// 
// Параметры:
// 	НаименованиеАлгоритма - Строка - Название элемента справочника Алгоритмы, поиск происходит по наименованию 
// 	ТекстАлгоритма - Строка - Значение реквизита "ТекстАлгоритма"
// 	Параметр1 - Произвольный - Произвольное значение
// 	Параметр2 - Произвольный - Произвольное значение
// 	Параметр3 - Произвольный - Произвольное значение
// 	Параметр4 - Произвольный - Произвольное значение
// 	Параметр5 - Произвольный - Произвольное значение
// 	Параметр6 - Произвольный - Произвольное значение
// 	Параметр7 - Произвольный - Произвольное значение
// 	Параметр8 - Произвольный - Произвольное значение
// 	Параметр9 - Произвольный - Произвольное значение
// 	МассивИменПараметров - Строка -  Разделенные запятыми имена параметров
// Возвращаемое значение:
// 	Строка - Результат выполнения сохранения алгоритма
//@skip-check method-too-many-params
Функция _Алг(НаименованиеАлгоритма, ТекстАлгоритма = "", Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено,
	Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено,
	Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено,
	Знач Параметр9 = Неопределено, Знач МассивИменПараметров = Неопределено) Экспорт

	Возврат УИ_АлгоритмыВызовСервера.СозданиеАлгоритма(НаименованиеАлгоритма, ТекстАлгоритма, Параметр1, Параметр2,
		Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9, СтрРазделить(МассивИменПараметров,
		",", Ложь));

КонецФункции

// Алг2.
// 
// Параметры:
//  ТекстАлгоритма - Строка - Текст алгоритма, передается процедура вида Модуль.Процедура(Пераметры....)
// 
// Возвращаемое значение:
//  Строка - Строка для формирования функции отладки
Функция _Алг2(ТекстАлгоритма) Экспорт
	ПерваяСкобка = СтрНайти(ТекстАлгоритма, "(");
	ПоследняяСкобка = СтрНайти(ТекстАлгоритма, ")");
	ПараметрыПроцедуры = Сред(ТекстАлгоритма, ПерваяСкобка + 1, ПоследняяСкобка - ПерваяСкобка - 1);
	МассивПараметров = СтрРазделить(ПараметрыПроцедуры, ",");
	КоличествоПараметров = МассивПараметров.Количество();
	Если КоличествоПараметров > 9 Тогда
		Возврат "Слишком много параметров";
	КонецЕсли;
	Для НомерПарамета = КоличествоПараметров + 1 По 9 Цикл
		МассивПараметров.Добавить("");
	КонецЦикла;

	Возврат СтрШаблон("УИ_._Алг(""%1"",""%2"",%3, ""%3"")", Лев(ТекстАлгоритма, ПерваяСкобка - 1), ТекстАлгоритма,
		СтрСоединить(МассивПараметров, ","));
КонецФункции

#КонецЕсли

#КонецОбласти

#Область СлужебныеПроцедурыИФункции


#КонецОбласти


